# 圖表運算式中輪替狀態機的範例

這些範例旨在展示 QlikView 開發人員及/或超級 QlikView 進階使用者使用輪替狀態機的最佳做法。這些範例可以在下列檔案中找到：‘Alternate States Functionality.qvw’

## 同步處理不同狀態的選項

下列運算式可用於單一圖表中：

* count({$} DISTINCT [Invoice Number])
* count({State1} DISTINCT [Invoice Number])
* count({State2} DISTINCT [Invoice Number])

這個方法有一個問題；QlikView 開發人員必須對於所有三個狀態複製選項 (列表框和多選方塊)，使用者才能對於不同的狀態選取正確的選項。在許多情況下，QlikView 開發人員會想要讓所有狀態都有一組「共同」選項。這能夠讓使用者設定不同圖表的內容，然後使用特定的選項顯示狀態之間的差異。可以對於狀態使用「集合分析」，使狀態之間的某些選項保持一致。

* count({State1&lt;Year = $::Year, Month = $::Month&gt;} DISTINCT [Invoice Number])
* count({State2&lt;Year = $::Year, Month = $::Month&gt;} DISTINCT [Invoice Number])

QlikView 開發人員將會讓 State1 和 State2 的年度和月份選項與預設狀態中的年度和月份選項保持同步。QlikView 開發人員可以視需要將元素新增到 set 修飾詞，以便讓狀態之間的更多欄位保持一致。

## 集合運算子

對於狀態可以使用運算子 (+、\*、-、/)。下列運算式均有效，而且將計算預設狀態 或 State1 的相異發票數。

範例：

* count({$ + State1} DISTINCT [Invoice Number])

  計算在 &lt;default&gt; 狀態及 State1 的聯集中的相異發票數。

* count({1 - State1} DISTINCT [Invoice Number])

  計算不在 State1 中的相異發票數。

* count({State1 \* State2} DISTINCT [Invoice Number])

  計算同時在 &lt;default&gt; 狀態及 State1 中的相異發票數。

資訊備註在這方面使用 set 運算子時，必須特別小心。在某些情況下，不會得到預期的結果。這是因為指定狀態中的選項會產生一組可能無法完全與所結合的集合相容的資料。資料模型的複雜度增加時，尤其會如此。

## 隱含欄位值定義

set 運算子也可用於元素函數 P() 及 E()。這些函數僅適用於 set 運算式。

範例：

* count({$&lt;[Invoice Number] = p({State1} [Invoice Number])&gt;} DISTINCT [Invoice Number])

  此運算式會依據 State1 中可能的發票數，計算 &lt;default&gt; 狀態中的相異發票數。

它相當於下列運算式，但不完全相同：

* count({$&lt;[Invoice Number] = State1::[Invoice Number]&gt;} DISTINCT [Invoice Number])

這些運算式的差別在於，在第一個運算式中，State1 的發票數可能值會傳遞到預設狀態。而在第二個運算式中，State1 的所選值會傳遞到預設狀態。如果使用者未選取 State1 中的任何發票數，就不會將任何發票數值傳遞到預設狀態。

在 set 修飾詞中最適合使用 set 運算子。下列運算式會找出 State1 與 State2 中可能發票數的交集，並且將這些值傳遞到預設狀態中的發票數。

範例：

* count({$&lt;[Invoice Number] = p({State1} [Invoice Number]) \* p({State2} [Invoice Number])&gt;} DISTINCT [Invoice Number])

此運算式會找出 &lt;default&gt; 狀態與 State1 中發票數的交集：

* count({$&lt;[Invoice Number] = p({$} [Invoice Number]) \* p({State1} [Invoice Number])&gt;} DISTINCT [Invoice Number])

此運算式可能看起來有些混淆，因為它在元素函數和 set 識別碼中使用狀態 (在本例中為 &lt;default&gt;)。請記住，元素函數 p($) 會傳回預設狀態中可能的值。set/state 識別碼 {$} 由元素函數的結果修改。目前在預設狀態中的任何發票選項將由元素函數交集的值所覆寫。

應該注意的是，以上的運算式並不完全正確，因為它無法同步處理預設狀態 與 State1 之間的共同選項。以下是能夠同步處理的運算式：

範例：

* count({$&lt;[Invoice Number] = p({$} [Invoice Number]) \* p({State1&lt;Year = $::Year, Month = $::Month&gt;} [Invoice Number])&gt;} DISTINCT [Invoice Number])

如上所述，QlikView Developer 可以將欄位新增到修飾詞，使不同狀態之間的選項保持一致。